const dayjs = require("../../libs/dayjs/dayjs.min.js");

const Default_Append_Count = 6;
/**
 * MonthItem 对象
 */
export class MonthItem {
	/**
	 * 构造函数，初始化日期相关属性
	 * @param {Date} [date] - 可选日期参数，默认为当前日期
	 * @property {Date} date - 日期对象
	 * @property {String} year - 格式化年份(YYYY)
	 * @property {String} month - 月份(MM)
	 * @property {String} formatDate - 格式化日期(YYYY-MM)
	 * @property {Number} dayStatus - 日期状态(-1:过去, 0:当月, 1:未来)
	 */
	constructor(date) {
		let currentDate = new Date();
		if (!date) date = currentDate;
		let monthItem = date;
		let dayjsObj = dayjs(monthItem);
		let monthStatus = dayjsObj.isBefore(currentDate, "month") ? -1 : dayjsObj.isAfter(currentDate, "month") ?
			1 : 0; // pass day == -1 | current day == 0 | future day == 1
		this.date = monthItem;
		this.year = dayjsObj.format('YYYY');
		this.month = dayjsObj.format('MMM');
		this.formatDate = dayjsObj.format('YYYY-MM');
		this.formatDateFull = dayjsObj.format('YYYY-MM-DD');
		this.monthStatus = monthStatus;
	}
}

/**
 * 获取当前日期所在半年的月份数据
 * @param {Date} [date] - 可选日期，默认为当前日期
 * @returns {Array<MonthItem>} 返回包含半年月份数据的数组
 * @description 
 * - 如果当前月份小于7月，则返回1-6月数据
 * - 如果当前月份大于等于7月，则返回7-12月数据
 * - 每个月份数据封装为MonthItem对象
 */
export function getHalfYearData(date) {
	if (!date) date = new Date();
	let result = [];
	let currentMonth = dayjs(date).month();
	let i = currentMonth < 6 ? 0 : 6; // 上半年 | 下半年
	let limit = currentMonth < 6 ? 6 : 12;
	while (i < limit) { // 0 一月 | 1 二月 | ... | 10 十一月 | 11 十二月
		let monthItem = dayjs(date).month(i).toDate();
		result.push(new MonthItem(monthItem));
		i++;
	}
	return result;
}

/**
 * 获取指定日期之后的半年列表数据
 * @param {Date} date - 基准日期 Date对象
 * @param {number} [count=Default_Append_Count] - 需要获取的半年数据数量
 * @returns {Array} 返回包含指定数量半年数据的数组
 */
export function getForwardMonthListData(date, count = Default_Append_Count) {
	let isFirstHalfYear = dayjs(date).month() < 6;
	let newestDate = dayjs(date).month(isFirstHalfYear ? 6 : 12).toDate()
	return getMonthListData(newestDate, count, 'forward');
}


/**
 * 获取指定日期之前的半年列表数据
 * @param {Date} date - 基准日期 Date对象
 * @param {number} [count=Default_Append_Count] - 需要获取的半年数据数量
 * @returns {Array} 返回包含指定数量半年数据的数组
 */
export function getBackwardMonthListData(date, count = Default_Append_Count) {
	let isFirstHalfYear = dayjs(date).month() < 6;
	let oldestDate = dayjs(date).month(isFirstHalfYear ? -1 : 5).toDate()
	return getMonthListData(oldestDate, count, 'backward');
}

/**
 * 获取指定日期前后若干周的周数据列表
 * @param {Date} date - 基准日期
 * @param {number} [count=4] - 要获取的周数
 * @param {string} [type='forward'] - 获取方向：'forward'获取后续周，'backward'获取之前周
 * @param {Array} [result=[]] - 递归使用的中间结果数组
 * @returns {Array} 周数据列表
 * @throws {Error} 当type参数不合法时抛出错误
 */
export function getMonthListData(date, count = Default_Append_Count, type = 'forward', result = []) {
	if (count <= 0) return result; // 如果count <= 0 已经跑完递归次数 停止递归算法，返回运算结果
	let isFirstHalfYear = dayjs(date).month() < 6;
	let halfYear = getHalfYearData(date); // 获取日期对应的半年数据列表
	let nextDate;
	switch (type) {
		case "forward":
			result.push(halfYear); // 因为是获取之后的日期数据，所以使用 push 插入列表尾部
			nextDate = dayjs(date).month(isFirstHalfYear ? 6 : 12).toDate(); // 如果是上半年，获取今年 7 月份的数据，如果下半年，获取明年 1 月份的数据
			break;
		case "backward":
			result.unshift(halfYear); // 因为是获取之前的日期数据，所以使用 unshift 插入列表头部
			nextDate = dayjs(date).month(isFirstHalfYear ? -1 : 5).toDate(); // 如果是上半年，获取去年 12 月份的数据，如果下半年，获取今年 6 月份的数据
			break;
		default:
			throw new Error('getWeekListData unknow type');
	}
	count--;
	// 递归调用，继续生成 上周、下周 数据
	return getMonthListData(nextDate, count, type, result);
}